from flask import current_app
from flask import g, jsonify
from flask import redirect
from flask import request
from flask import session

from info import constants
from info import db
from info.models import News
from info.utils.captcha.response_code import RET
from info.utils.commons import user_login_data
from info.utils.image_storage import image_storage
from . import profile_blue
from flask import render_template


#功能描述: 获取我的收藏
# 请求路径: /user/ collection
# 请求方式:GET
# 请求参数:p(页数)
# 返回值: user_collection.html页面
@profile_blue.route('/collection')
@user_login_data
def collection():
    #1.获取参数
    page = request.args.get("p","1")

    #2.参数类型转换
    try:
        page = int(page)
    except Exception as e:
        page = 1

    #3.分页查询
    try:
        paginate = g.user.collection_news.order_by(News.create_time.desc()).paginate(page,constants.USER_COLLECTION_MAX_NEWS,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="获取新闻失败")

    #4.获取分页对象属性,总页数,当前页,当前页对象列表
    totalPage = paginate.pages
    currentPage = paginate.page
    items = paginate.items;

    #5.新闻对象列表,转成字典列表
    news_list = []
    for item in items:
        news_list.append(item.to_dict())

    #5.携带数据,渲染页面
    data = {
        "totalPage":totalPage,
        "currentPage":currentPage,
        "news_list":news_list
    }
    return render_template("news/user_collection.html",data=data)



#功能描述：修改密码
#请求路径：/user/pass_info
#请求方式:GET/POST
#请求参数：GET无，POST参数，old_password,new_password
#返回值:GET请求：user_pass_info.html页面，data字典数据，POST请求：errno,errmsg
@profile_blue.route('/pass_info', methods=['GET', 'POST'])
@user_login_data
def pass_info():
    #1.如果是GET请求,直接渲染页面
    if request.method == "GET":
        return render_template("news/user_pass_info.html")

    #2.如果是POST获取参数
    old_password = request.json.get("old_password")
    new_password = request.json.get("new_password")

    #3.校验参数,为空校验
    if not all([old_password,new_password]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数不全")

    #4.判断旧密码是否正确
    if not g.user.check_password(old_password):
        return jsonify(errno=RET.DATAERR,errmsg="旧密码错误")

    #5.设置新密码到用户对象
    g.user.password = new_password

    #5.1 清除用户登陆信息
    session.pop("user_id",None)
    session.pop("nick_name",None)
    session.pop("mobile",None)

    #6.返回响应
    return jsonify(errno=RET.OK,errmsg="修改成功")

#功能描述：图片上传
#请求路径：/user/pic_info
#请求方式：GET,POST
#请求参数：无 POST有参数，avatar
#返回值：GET请求：user_pic_info,html页面,data字典数据 ，POST请求：errno,errmsg,avatar_url
@profile_blue.route('/pic_info',methods=['GET','POST'])
@user_login_data
def pic_info():
    # 1.判断如果是GET请求，携带用户图片渲染页面
    if request.method == "GET":
        return render_template("news/user_pic_info.html",user=g.user.to_dict())
    # 2.如果是·POST请求，获取参数
    avatar = request.files.get("avatar")

    # 3.校验参数
    if not avatar:
        return jsonify(errno=RET.PARAMERR,errmsg="参数不全")
    # 4.上传图片，判断是否上传成功
    try:
        image_name = image_storage(avatar.read())
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg="七牛云异常")

    if not image_name: return jsonify(errno=RET.NODATA,errmsg="图片上传失败")

    # 5.设置图片到用户对象
    g.user.avatar_url = image_name
    # 6.返回响应，返回图片地址
    data = {
        "avatar_url":constants.QINIU_DOMIN_PREFIX + image_name
    }
    return jsonify(errno=RET.OK,errmsg="图片上传成功")


#用户基本信息展示
#请求路径：/user/base_info
#请求方式：GET/POST
#请求参数：POST请求参数，nick_name.signature,gender
#返回值：errno errmsg

@profile_blue.route('/base_info',methods=['GET','POST'])
@user_login_data
def base_info():

    #判断如果是GET请求，携带数据显示页面
    if request.method == 'GET':
        return render_template("news/user_base_info.html",user=g.user.to_dict())

    #如果是POST请求
    signature = request.json.get("signature")
    nick_name = request.json.get("nick_name")
    gender = request.json.get("gender")

    #校验参数，为空校验
    if not all([signature,nick_name,gender]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数不全")
    #更新数据到用户对象中
    try:
        g.user.signature = signature
        g.user.nick_name = nick_name
        g.user.gender = gender
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="修改失败")

    #返回响应
    return jsonify(errno=RET.OK,errmsg="修改成功")

@profile_blue.route('/info')
@user_login_data
def user_info():
    #判断用户是否登录了
    if not g.user:
        return redirect("/")
    #携带用户数据渲染页面
    data = {
        "user_info":g.user.to_dict()
    }

    return render_template('news/user.html', data=data)